package liangtWorkSpace.proxy.cglib.aop;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @ClassName ProxyFactory
 * @Description : 功能说明
 * @Author : LiangT
 * @Date : 2020/4/12 12:47
 */
public class ProxyFactory  implements MethodInterceptor {

    //设置要被代理的对象
    private Object object;

    public Object createProxy(Object traget){
        this.object = traget;
        Enhancer enhancer = new Enhancer();

        //设置代理目标
        enhancer.setSuperclass(this.object.getClass());
        //设置单一回调对象，在调用中拦截对目标方法的调用
        enhancer.setCallback(this);
        //设置类加载器
        enhancer.setClassLoader(this.object.getClass().getClassLoader());
        return enhancer.create();
    }

    /**
     * 基于代理的方法回调时，在调用原方法前会调用该方法。
     * 拦截对目标方法的调用
     * @param o 代理的对象
     * @param method 拦截的方法
     * @param objects 拦截方法的数
     * @param methodProxy 代理类
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        Object o1 = null;
        try {
            //前置通知
            before();
            o1 = methodProxy.invokeSuper(o,objects);
            //后置通知
            after();
        }catch (Exception e){
            //异常通知
            exception();
            e.printStackTrace();
        }finally {
            //返回前通知
            beforeReturning();
        }
        return o1;
    }
    private void before() {
        System.out.println("before method invoke...");
    }
    private void after() {
        System.out.println("after method invoke...");
    }
    private void exception() {
        System.out.println("exception method invoke...");
    }
    private void beforeReturning() {
        System.out.println("beforeReturning method invoke...");
    }
}
